# Maintainer: lauren n. liberda <lauren@selfisekai.rocks>
pkgname=electron
pkgver=28.1.0
_semver="${pkgver/_beta/-beta.}"
pkgrel=0
_chromium=120.0.6099.129
_depot_tools=b5509953468edd0906f2dc297886939abbd2bed5
_extra_patches=120
pkgdesc="Electron cross-platform desktop toolkit"
url="https://github.com/electron/electron"
arch="aarch64 x86_64" # same as chromium
license="MIT"
depends="gtk+3.0 so:libudev.so.1 xdg-utils"
makedepends="
	alsa-lib-dev
	aom-dev
	bash
	brotli-dev
	bsd-compat-headers
	bzip2-dev
	c-ares-dev
	cairo-dev
	clang16-dev
	clang-extra-tools
	compiler-rt
	crc32c-dev
	cups-dev
	curl-dev
	dav1d-dev
	dbus-glib-dev
	double-conversion-dev
	eudev-dev
	ffmpeg-dev
	findutils
	flac-dev
	flex
	freetype-dev
	gperf
	gtk+3.0-dev
	gn
	gzip
	harfbuzz-dev
	highway-dev
	hunspell-dev
	http-parser-dev
	hwdata-dev
	java-jdk
	jpeg-dev
	krb5-dev
	lcms2-dev
	libarchive-tools
	libavif-dev
	libbsd-dev
	libcap-dev
	libdrm-dev
	libevent-dev
	libexif-dev
	libgcrypt-dev
	libjpeg-turbo-dev
	libnotify-dev
	libsecret-dev
	libusb-dev
	libva-dev
	libwebp-dev
	libxcomposite-dev
	libxcursor-dev
	libxinerama-dev
	libxml2-dev
	libxrandr-dev
	libxscrnsaver-dev
	libxslt-dev
	linux-headers
	lld
	llvm16
	mesa-dev
	minizip-dev
	nghttp2-dev
	nodejs
	npm
	nss-dev
	openh264-dev
	opus-dev
	pciutils-dev
	perl
	pipewire-dev
	pulseaudio-dev
	py3-httplib2
	py3-parsing
	py3-six
	python3
	qt5-qtbase-dev
	re2-dev
	rsync
	rust
	samurai
	speex-dev
	sqlite-dev
	xcb-proto
	yarn
	zlib-dev
	zstd-dev
	"
subpackages="$pkgname-lang $pkgname-dev"
# the lower patches are specific to electron, the top ones are from the equivalent chromium version
source="https://s3.sakamoto.pl/lnl-aports-snapshots/electron-$_semver-$_chromium.tar.zst
	https://gitlab.com/Matt.Jolly/chromium-patches/-/archive/$_extra_patches/chromium-patches-$_extra_patches.tar.bz2
	atspi-unused.patch
	chromium-icu-74.patch
	chromium-revert-drop-of-system-java.patch
	compiler.patch
	disable-failing-tests.patch
	fc-cache-version.patch
	fix-missing-cstdint-include-musl.patch
	fstatat-32bit.patch
	gdbinit.patch
	generic-sensor-include.patch
	gwp-asan-include.patch
	import-version.patch
	libstdc++13.patch
	mman.patch
	musl-auxv.patch
	musl-sandbox.patch
	musl-tid-caching.patch
	musl-v8-monotonic-pthread-cont_timedwait.patch
	no-execinfo.patch
	no-mallinfo.patch
	no-res-ninit-nclose.patch
	no-sandbox-settls.patch
	partalloc-no-tagging-arm64.patch
	perfetto-libstdc++.patch
	pvalloc.patch
	random-fixes.patch
	quiche-array.patch
	temp-failure-retry.patch
	yes-musl.patch

	icon.patch
	python-jinja-3.10.patch
	webpack-hash.patch

	default.conf
	electron.desktop
	electron-launcher.sh
	"
# tests are todo for some base checks
options="!check net suid"
builddir="$srcdir/electron-$_semver-$_chromium"

export PATH="$PATH:/usr/lib/qt5/bin"

# clang uses much less memory (and this doesn't support gcc)
export CC=clang-16
export CXX=clang++-16

# required to find the tools
export AR=llvm16-ar
export NM=llvm16-nm
export LD=clang++-16

# less log spam, reproducible
export CFLAGS="${CFLAGS/-g/} -O2 -Wno-unknown-warning-option -Wno-builtin-macro-redefined -Wno-deprecated-declarations"
export CXXFLAGS="${CXXFLAGS/-g/} -O2 -Wno-unknown-warning-option -Wno-builtin-macro-redefined -Wno-deprecated-declarations"
export CPPFLAGS="${CPPFLAGS/-g/} -D__DATE__=  -D__TIME__=  -D__TIMESTAMP__="

# breaks chromium-based stuff
export CXXFLAGS="${CXXFLAGS/-D_GLIBCXX_ASSERTIONS=1}"

# creates a dist tarball that does not need to git clone everything at build time.
_distbucket="sakamoto/lnl-aports-snapshots/"
snapshot() {
	deps
	# vpython3 execs system python3 with this set
	export VPYTHON_BYPASS="manually managed python not supported by chrome operations"
	export CHROMIUM_BUILDTOOLS_PATH="$srcdir/src/buildtools"
	mkdir -p "$srcdir"
	cd "$srcdir"
	if ! [ -d src ]; then
		git clone --branch=$_chromium --depth=1 \
			https://chromium.googlesource.com/chromium/src.git
	fi

	if ! [ -d electron ]; then
		git clone https://github.com/electron/electron.git
	fi

	if ! [ -d depot_tools ]; then
		(
			git clone --depth 1 -b main https://chromium.googlesource.com/chromium/tools/depot_tools.git
			cd depot_tools
			git fetch --depth 1 origin $_depot_tools
			git checkout $_depot_tools
		)
	fi

	export PATH="$PATH:$srcdir/depot_tools"

	echo "solutions = [
	{
		\"name\": \"src/electron\",
		\"url\": \"file://$srcdir/electron@v$_semver\",
		\"deps_file\": \"DEPS\",
		\"managed\": False,
		\"custom_deps\": {
			\"src\": None,
		},
		\"custom_vars\": {},
	},
	]" > .gclient

	python3 depot_tools/gclient.py sync \
		--with_branch_heads \
		--with_tags \
		--nohooks

	python3 src/build/landmines.py
	python3 src/build/util/lastchange.py -o src/build/util/LASTCHANGE
	python3 src/build/util/lastchange.py -s src/third_party/dawn \
		--revision src/gpu/webgpu/DAWN_VERSION
	python3 src/build/util/lastchange.py -m GPU_LISTS_VERSION \
		--revision-id-only --header src/gpu/config/gpu_lists_version.h
	python3 src/build/util/lastchange.py -m SKIA_COMMIT_HASH \
		-s src/third_party/skia --header src/skia/ext/skia_commit_hash.h

	# why?
	cp -r electron/patches/ffmpeg src/electron/patches/

	# rolled newer chromium with it included
	sed -i '/cherry-pick-8d607d3921b8.patch/d' electron/patches/chromium/.patches

	python3 electron/script/apply_all_patches.py \
		electron/patches/config.json

	python3 src/tools/update_pgo_profiles.py \
		--target=linux \
		update \
		--gs-url-base=chromium-optimization-profiles/pgo_profiles

	python3 src/tools/download_optimization_profile.py \
		--newest_state=src/chrome/android/profiles/newest.txt \
		--local_state=src/chrome/android/profiles/local.txt \
		--output_name=src/chrome/android/profiles/afdo.prof \
		--gs_url_base=chromeos-prebuilt/afdo-job/llvm

	mv src $pkgname-$_semver-$_chromium

	# extra binaries are most likely things we don't want, so nuke them all
	for elf in $(scanelf -RA -F "%F" $pkgname-$_semver-$_chromium); do
		rm -f "$elf"
	done

	msg "generating tarball.. (this takes a while)"
	tar -cf $pkgname-$_semver-$_chromium.tar \
		--exclude="ChangeLog*" \
		--exclude="testdata/*" \
		--exclude="test_data/*" \
		--exclude="android_rust_toolchain/*" \
		--exclude-backups \
		--exclude-caches-all \
		--exclude-vcs \
		$pkgname-$_semver-$_chromium

	zstd --auto-threads=logical --ultra --long -22 -T"${ZSTD_LIMIT:-0}" -vv $pkgname-$_semver-$_chromium.tar -o "$SRCDEST"/$pkgname-$_semver-$_chromium.tar.zst
	mcli cp "$SRCDEST"/$pkgname-$_semver-$_chromium.tar.zst "$_distbucket"
}

_extra_patch() {
	msg chromium-"$1".patch
	patch -Np1 < "$srcdir"/chromium-patches-"$_extra_patches"/chromium-"$1".patch
}

prepare() {
	dos2unix third_party/vulkan_memory_allocator/include/vk_mem_alloc.h

	default_prepare

	_extra_patch 117-system-zstd
	_extra_patch 119-clang16

	git init -q .

	# link to system tools
	ln -sfv /usr/bin/clang-format buildtools/linux64/clang-format
	mkdir -p third_party/node/linux/node-linux-x64/bin
	ln -sfv /usr/bin/node third_party/node/linux/node-linux-x64/bin/node
	ln -sfv /usr/bin/java third_party/jdk/current/bin/java

	(
		cd electron
		git init -q .
		git config user.email "example@example.com"
		git config user.name "example"
		git config commit.gpgsign false
		git add LICENSE
		git commit -m "init"
		git tag "v$_semver"
		git pack-refs
		yarn install --frozen-lockfile --no-scripts
	)

	(
		cd third_party/node
		./update_npm_deps
	)

	# reusable system library settings
	# libavif - https://github.com/AOMediaCodec/libavif/commit/4d2776a3
	# libaom - https://aomedia.googlesource.com/aom/+/706ee36dcc82%5E%21/
	# jsoncpp, re2, snappy, swiftshader-spirv, woff2 - requires use_custom_libcxx=false
	local use_system="
		brotli
		crc32c
		dav1d
		double-conversion
		ffmpeg
		flac
		fontconfig
		freetype
		harfbuzz-ng
		highway
		icu
		libdrm
		libevent
		libjpeg
		libsecret
		libusb
		libwebp
		libxml
		libxslt
		openh264
		opus
		zlib
		zstd
		"

	for _lib in $use_system libjpeg_turbo electron_node/deps/openssl; do
		msg "Removing buildscripts for system provided $_lib"
		find . -type f -path "*third_party/$_lib/*" \
			\! -path "*third_party/$_lib/chromium/*" \
			\! -path "*third_party/$_lib/google/*" \
			\! -path './base/third_party/icu/*' \
			\! -path './third_party/libxml/*' \
			\! -path './third_party/pdfium/third_party/freetype/include/pstables.h' \
			\! -path './third_party/harfbuzz-ng/utils/hb_scoped.h' \
			\! -path './third_party/crashpad/crashpad/third_party/zlib/zlib_crashpad.h' \
			\! -regex '.*\.\(gn\|gni\|gyp\|gypi\|isolate\|py\)' \
			-delete
	done

	# https://groups.google.com/a/chromium.org/d/topic/chromium-packagers/9JX1N2nf4PU/discussion
	touch chrome/test/data/webui/i18n_process_css_test.html
	# Use the file at run time instead of effectively compiling it in
	sed 's|//third_party/usb_ids/usb.ids|/usr/share/hwdata/usb.ids|g' \
		-i services/device/public/cpp/usb/BUILD.gn

	msg "Running debundle script"
	python3 build/linux/unbundle/replace_gn_files.py --system-libraries \
		$use_system
	python3 third_party/libaddressinput/chromium/tools/update-strings.py

	# prevent annoying errors when regenerating gni
	sed -i 's,^update_readme$,#update_readme,' \
		third_party/libvpx/generate_gni.sh

	# allow system dependencies in "official builds"
	sed -i 's/OFFICIAL_BUILD/GOOGLE_CHROME_BUILD/' \
		tools/generate_shim_headers/generate_shim_headers.py

	# https://crbug.com/893950
	sed -i -e 's/\<xmlMalloc\>/malloc/' -e 's/\<xmlFree\>/free/' \
		third_party/blink/renderer/core/xml/*.cc \
		third_party/blink/renderer/core/xml/parser/xml_document_parser.cc \
		third_party/libxml/chromium/*.cc \
		third_party/maldoca/src/maldoca/ole/oss_utils.h

	_configure
}

_configure() {
	cd "$builddir"
	msg "Configuring build"

	# shellcheck disable=2089
	local gn_config="
		clang_base_path=\"/usr\"
		custom_toolchain=\"//build/toolchain/linux/unbundle:default\"
		host_toolchain=\"//build/toolchain/linux/unbundle:default\"
		import(\"//electron/build/args/release.gn\")

		blink_enable_generated_code_formatting=false
		chrome_pgo_phase=0
		clang_use_chrome_plugins=false
		fatal_linker_warnings=false
		ffmpeg_branding=\"Chrome\"
		icu_use_data_file=true
		is_cfi=false
		is_clang=true
		is_component_ffmpeg=true
		is_debug=false
		is_official_build=true
		symbol_level=0
		treat_warnings_as_errors=false

		angle_enable_gl_null=false
		build_tflite_with_xnnpack=false
		build_with_tflite_lib=true
		disable_fieldtrial_testing_config=true
		enable_hangout_services_extension=true
		enable_library_cdms=false
		enable_media_remoting=false
		enable_nacl=false
		enable_nocompile_tests_new=false
		enable_paint_preview=false
		enable_reading_list=false
		enable_remoting=false
		enable_reporting=false
		enable_rust=false
		enable_screen_ai_service=false
		enable_service_discovery=false
		enable_stripping=false
		enable_vr=false
		ozone_platform_headless=false

		link_pulseaudio=true
		proprietary_codecs=true
		regenerate_x11_protos=true
		rtc_link_pipewire=true
		rtc_use_pipewire=true
		use_custom_libcxx=true
		use_dawn=false
		use_pulseaudio=true
		use_sysroot=false
		use_system_cares=true
		use_system_lcms2=true
		use_system_libffi=true
		use_system_nghttp2=true
		use_vaapi=true
		"

	# shellcheck disable=2086,2090,2116
	gn gen out/Release --args="$(echo $gn_config)" \
		--export-compile-commands
}

build() {
	export PATH="$PATH:/usr/lib/qt5/bin"

	ninja -C out/Release \
		electron_dist_zip \
		node_gypi_headers \
		node_version_header

	cp -vf out/Release/gen/node_headers/include/node/config.gypi third_party/electron_node/config.gypi
}

package() {
	mkdir -p "$pkgdir"/usr/lib/electron "$pkgdir"/usr/bin

	bsdtar -xf out/Release/dist.zip -C "$pkgdir"/usr/lib/electron

	chmod u+s "$pkgdir"/usr/lib/electron/chrome-sandbox

	install -Dm755 "$srcdir"/electron-launcher.sh "$pkgdir"/usr/bin/electron
	install -Dm755 "$srcdir"/default.conf "$pkgdir"/etc/electron/default.conf

	mkdir -p "$pkgdir"/usr/include/electron

	(
		cd third_party/electron_node/
		HEADERS_ONLY=1 python3 ./tools/install.py install "$pkgdir" "/usr/include/electron/node_headers"
	)
	# required overrides
	install -Dm644 out/Release/gen/node_headers/include/node/* -t "$pkgdir"/usr/include/electron/node_headers/include/node
	ln -sv /usr/include/electron/node_headers/include/node "$pkgdir"/usr/include/electron/node

	mkdir -p "$pkgdir"/usr/include/electron/node_headers/include/nan
	cp -v "$builddir"/third_party/nan/*.h "$pkgdir"/usr/include/electron/node_headers/include/nan
	ln -sv /usr/include/electron/node_headers/include/nan "$pkgdir"/usr/include/electron/nan

	install -Dm644 electron/default_app/icon.png \
		"$pkgdir"/usr/share/icons/hicolor/1024x1024/apps/electron.png
	install -Dm644 "$srcdir"/electron.desktop \
		-t "$pkgdir"/usr/share/applications/
}

lang() {
	pkgdesc="$pkgdesc (translations)"
	install_if="$pkgname=$pkgver-r$pkgrel lang"

	mkdir -p "$subpkgdir"/usr/lib/electron/locales

	mv "$pkgdir"/usr/lib/electron/locales/*.pak \
		"$subpkgdir"/usr/lib/electron/locales
	mv "$subpkgdir"/usr/lib/electron/locales/en-US.pak \
		"$pkgdir"/usr/lib/electron/locales
}

sha512sums="
a63b2dd86083c42c518ce369d2abb681f43affde8448578a2cc594a8cf7566c0b5afb958a8ed4ba2cdb205209eb954ce23c6b145200cef2263243a719d7aef7f  electron-28.1.0-120.0.6099.129.tar.zst
1af05a17c54ea2f23b6f18b40c21304a94076eda4f9dcdf34ff93e1a729ae5a6b69816d32b5855b1cbb412eefaefb3d343fce05afd99347dcf9302a1d47ad3e6  chromium-patches-120.tar.bz2
391d537ebe3b7c1b78dde59f0fe7697d44a56326193a7fa4059a1c5e3479f320abb41419687ea5da9e4f2eaed274393a9ed2fdd5dbc4f7ad6e66b96490736a7d  atspi-unused.patch
4c540972fa12acd9f0aafb8dc7e9987c3d6e4f28ff679dde522ebcec2dc5ae1a62d9d255bed0a30b9c79ae3b90ab0f5b9ae1ef5b7bf338612e28d9ef70250ca3  chromium-icu-74.patch
29bb685e03356a77df5fd347cdf55194cc8b3265c421cc76e54d64edefc329dbcb052deb26b22e8f587ce68456876c071de1b7d258dd0fcc6ee66c875ec4a020  chromium-revert-drop-of-system-java.patch
8af9b45c8c1ef3a12aea008c59d9244697d238845c738a1b3cc7a2ba1104b10b212ac196dc180840da862e2b16af1002ca6f5928a8fbffa2517840b188c68610  compiler.patch
111bc22fb704d97759988268a40d6b356c51b0bd7a8119a694e905ffe21850ff64e91566cd0dd0c9d62fcb46dca8acc821436c34eb0ba78be872ee4f7ec88a7b  disable-failing-tests.patch
5fc5c012c1db6cf1ba82f38c6f3f4f5ca3a209e47ac708a74de379b018e0649b7694877c9571ef79002dde875ffc07b458a3355425f1c01867f362c66c2bc1bf  fc-cache-version.patch
9200f78bad70e95c648a5e8392d50642190600f655c6baa366ff6467ebad52d3b3f305dad58f3610da67136f4b723557653b174ec5c25be8d8737ee04d9ee09f  fix-missing-cstdint-include-musl.patch
c63dee5044353eb306a39ca1526158c0f003ab310ecb03d1c368dc2a979454590c84b8d3c15484517d5e66bb8add9b231da9abbadf2e50850abd72ac1345c4ab  fstatat-32bit.patch
33ee60863cc438ef57ffef92ba4cf67a856a5ffc16138bce241bcf87e47b15154aa86918e793c26f7ec4dc62a445257ad5673ed7001daf22c4043cf6cc57da7f  gdbinit.patch
36a764fa73443b47d38050b52dbe6ad2fa8d67201ff4ccdbad13b52308ef165ca046aac6f9609fe35890a6485f0f3e672e78cc41e3e44f3cdc7f145e540524e8  generic-sensor-include.patch
c1884bc5fe8d2b08722de964710f1bf7eb48076dd4e482826e0e9ce23b0f13000bb80dd9fe977e64e8c312ffd1aa9671ba9ab2c029900acf2710a512f8763065  gwp-asan-include.patch
8de65109ece27ea63bd469f2220c56b8c752ba0a50fdf390082a2d5ae74b8e010199126175569f6d5084270dd4e0571e68aec32c0bca8211a6699925b3a09124  import-version.patch
dea7e4857ff9d7a017de5943d6194285ce8a72965d51deba500ed1fb287b918b3b6b067c57e3d47da1423c5168cf50678eb04705e80e2da954187c71435d1af1  libstdc++13.patch
e75f57ae34c97ca1caf15fa4b4106c6c1e79c31ed66869cf92ed9ea0c449886c9511e455047c17c1e9ad8b9a46ad4948511a4f2995a4b6030fb4d1c7ae21d038  mman.patch
99bcc7dd485b404a90c606a96addab1d900852128d44fb8cea8acc7303189ef87c89a7b0e749fd0e10c5ef5f6bf1fadeb5c16a34503cab6a59938ce2653d887e  musl-auxv.patch
50c274a420bb8a7f14fcb56e40920dac8f708792a4520789b4987facea459bef88113d5a2b60fa8c57bee6e92bff3617d6b73fa305c8c44614c638971cffd440  musl-sandbox.patch
e7163ac5810ac85366cef2447412287c856e3d67c6b77f219a6e5a418b1965b98e449c409424ad0704a5bded9355dd0aec3dc4585918ce5a2ab36c079707afe2  musl-tid-caching.patch
92eb002718026611f5542362ad69b67f0a398ff71b3fca5c05d55cb5c6f9f29334e5e127bb4860cfaa3fba0f0d4c901e2b98808217e7dc02e254a64a5c9521aa  musl-v8-monotonic-pthread-cont_timedwait.patch
5eb0b83264e2c9213fb871838827eb7875c05131a42d901032d6d1f05eec98609fefac4772385046887a773daf4f1e0ee5a647e82c1c3d73aec3fcf76f887084  no-execinfo.patch
8e17101d69e23b456a9c03dc2fe95bcd56846389707ba6f4720192a9e9168406d20d9168dbebbb3a47d921ec92e478f0e390f46e6b9bb43a34dda217c6e6448b  no-mallinfo.patch
e4c4e5bc6f828f9c883dd418c0ba01887949c29c311f76206a1ec29f620b0c0ba0452949dc2778a9c46ea066405857536964a36436a68eecf7da7952736333cf  no-res-ninit-nclose.patch
6dc4d8dc92e685dace62265a1ddb3aebc558aed54d20ff6d36b030be0c48d7e84662326c31363612492574d9a03c62653cdc21a60995b97dee1d75cae86a9f9b  no-sandbox-settls.patch
560ad0f4482d9c5ae3cf2773636aa913aacca439567b83b1214dc46cc5e63950f329c229cedf7d7ada331e5e3432767974954bad8ad34c30130fb21cb8f0c7da  partalloc-no-tagging-arm64.patch
8e1aca983890c78d81a6f888b2cf1aa42878d1f8523e87d63b800e1e468cbfd33e5ff6a0975775ca222fe82f30c6497da95505da01b091c8776a44c98ac86f0f  perfetto-libstdc++.patch
2eb434b4fc6aee77026492644cd86772a543d9845f112a75cd4c3e1f25c9435cc31f8454c1c73223451fc9be69b86e822ff68821978f67f2fc8bcba50296d8e0  pvalloc.patch
803b8117c65132f76bec42054a4b2257a078b15b07fd08645fec2dfd51aa4e0075a9015300cd579d4ae0d757d9850b9988e080cfc2eea093f6684fdf82c4722c  random-fixes.patch
86f612dd2b39602984a75b1b11c2ab8bc8cc6b4e78fae998570a777a6901ae45fdcdb22e46dd006dab703a0674e64c72cf8120af2dc5b9e78004f402c7e65358  quiche-array.patch
e48693e6b7aeebf69a5acbf80d9a35defe4c23835121dfeb58b051ac7c527e758a41004f4d193274fe1b01c0bfb1dbc77b09cb6a404a3fdee507a2918afb0edb  temp-failure-retry.patch
914ccf649d7771f19f209ab97f99c481aebc6f66174d68e8b539f6ad4a70bc8cb0fae2df6dadbf0415958ffb3574c420fe029079dcce45f5e5add4db2e903566  yes-musl.patch
465107da7818b237e3c144a318ab80c3c9343b51ed38b8971ef204692d13346929becbe94cefad4c153788d3a200642143584d5ca070f6304e768ba2139c19ec  icon.patch
e05180199ee1d559e4e577cedd3e589844ecf40d98a86321bf1bea5607b02eeb5feb486deddae40e1005b644550331f6b8500177aa7e79bcb3750d3c1ceb76c3  python-jinja-3.10.patch
2aa340854316f1284217c0ca17cbf44953684ad6c7da90815117df30928612eb9fb9ffb734b948dfc309cd25d1a67cd57f77aac2d052a3dd9aca07a3a58cbb30  webpack-hash.patch
e8ea87c547546011c4c8fc2de30e4f443b85cd4cfcff92808e2521d2f9ada03feefb8e1b0cf0f6b460919c146e56ef8d5ad4bb5e2461cc5247c30d92eb4d068e  default.conf
191559fc7aa1ea0353c6fb0cc321ee1d5803a0e44848c8be941cfab96277b0de6a59962d373e2a2a1686c8f9be2bcf2d2f33706759a339a959e297d3f7fda463  electron.desktop
5f7ba5ad005f196facec1c0f26108356b64cafb1e5cfa462ff714a33b8a4c757ac00bfcb080da09eb5b65032f8eb245d9676a61ec554515d125ed63912708648  electron-launcher.sh
"
